package email

import (
	"crypto/tls"
	"net"
	"strings"

	"github.com/go-gomail/gomail"

	"bbtradeByGo/pkg/config"
	"bbtradeByGo/pkg/gredis"
	"bbtradeByGo/pkg/logging"
)

// SendMail 发送邮件
func SendMail(id, detail string) {
	key := "leo:mail:err"

	value := gredis.Exists(key)
	// 如果Key不存在，设置过期时间
	if value == false {
		_, err := gredis.SetAdd(key, id+detail, 3600*24+1)
		if err != nil {
			logging.Error("SendMail SADD Fail")
		}
	} else {
		num, err := gredis.SetAdd(key, id+detail, nil)
		if err != nil {
			logging.Error("email.SendMail setAdd fail")
			return
		}
		// 如果记录已经存在就直接返回
		if num == 0 {
			return
		}
	}
	// 发送邮件
	if err := MailSending(id, detail); err != nil {
		logging.Error("email.SendMail mailSending fail")
		return
	}
	logging.Info("email.SendMail success!!!!")
	return
}

// MailSending 发送邮件
func MailSending(id, detail string) error {
	m := gomail.NewMessage()
	// 发件人
	m.SetAddressHeader("From", config.EmailSetting.Username, "")
	// 收件人
	m.SetHeader("To", strings.Split(config.EmailSetting.Admins, ",")[0])
	// 抄送
	m.SetHeader("Cc", strings.Split(config.EmailSetting.Admins, ",")[1:]...)
	// 主题
	m.SetHeader("Subject", "500错误请处理！")
	// 获取本地IP地址，主要为了区分错误来自测试服还是正式服, 来自哪里？
	ip, err := GetIP()
	if err != nil {
		return err
	}
	// 内容
	m.SetBody("text/html", "<h4>FROM: "+ip+"<h4><h4>ID: "+id+"<h4><h4>DETAIL: "+detail+"<h4>")
	// 发送邮件服务器、端口、发件人账号、发件人密码
	d := gomail.NewDialer(config.EmailSetting.Server, config.EmailSetting.Port, config.EmailSetting.Username, config.EmailSetting.Password)
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
	if err := d.DialAndSend(m); err != nil {
		return err
	}
	return nil
}

// GetIP 获取IP地址
func GetIP() (string, error) {
	conn, err := net.Dial("udp", "www.baidu.com:80")
	if err != nil {
		return "这是个意外", err
	}
	defer conn.Close()
	ip := strings.Split(conn.LocalAddr().String(), ":")[0]
	return ip, nil
}
